home *** CD-ROM | disk | FTP | other *** search
/ Tech Arsenal 1 / Tech Arsenal (Arsenal Computer).ISO / tek-01 / tty.zip / TTYIO.ASM < prev    next >
Assembly Source File  |  1992-03-11  |  17KB  |  1,276 lines

  1. ;    Written by Chris Sokol
  2.  
  3. PUBLIC    _TTYAvail
  4. PUBLIC    _TTYClose
  5. PUBLIC    _TTYDone
  6. PUBLIC    _TTYGet
  7. PUBLIC    _TTYInit
  8. PUBLIC    _TTYOpen
  9. PUBLIC    _TTYPut
  10. PUBLIC    _TTYTerm
  11.  
  12. TTY_TEXT    SEGMENT PUBLIC 'CODE'
  13.  
  14. ASSUME    cs:TTY_TEXT, ds:TTY_TEXT
  15.  
  16. INCLUDE    ttyio.inc
  17.  
  18. Dummy        DW    0                                    ; So OFFSET Handles[0] != 0
  19. Handles    TTYHand    MAX_TTYS DUP (<>)
  20. IrqPtrs    TTYIrq    16 DUP (<>)
  21.  
  22. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  23.  
  24. _TTYAvail:
  25.     push    bp
  26.     mov    bp, sp
  27.     push    ds
  28.     push    si
  29.  
  30.     mov    ax, cs
  31.     mov    ds, ax
  32.  
  33.     mov    al, 6[bp]
  34.     call    GetHand
  35.     jnc    AvCheck
  36.  
  37.     mov    ax, ERRbhand
  38.     jmps    AvExit
  39.  
  40. AvCheck:
  41.     mov    ax, [si].THrxbuf.TBin
  42.     sub    ax, [si].THrxbuf.TBout
  43.     jz        AvExit
  44.  
  45.     mov    ax, 1
  46.  
  47. AvExit:
  48.     pop    si
  49.     pop    ds
  50.     pop    bp
  51.     retf
  52.  
  53. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  54.  
  55. _TTYClose:
  56.     push    bp
  57.     mov    bp, sp
  58.     push    ds
  59.     push    si
  60.  
  61.     mov    ax, cs
  62.     mov    ds, ax
  63.  
  64.     mov    al, 6[bp]
  65.     call    GetHand
  66.     jnc    ClClose
  67.  
  68.     mov    ax, ERRbhand
  69.     jmps    ClExit
  70.  
  71. ClClose:
  72.     call    HandClose
  73.     call    HandFree
  74.  
  75.     xor    ax, ax
  76.  
  77. ClExit:
  78.     pop    si
  79.     pop    ds
  80.     pop    bp
  81.     retf
  82.  
  83. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  84.  
  85. _TTYDone:
  86.     push    bp
  87.     mov    bp, sp
  88.     push    ds
  89.     push    si
  90.  
  91.     mov    ax, cs
  92.     mov    ds, ax
  93.  
  94.     mov    al, 6[bp]
  95.     call    GetHand
  96.     jnc    DoCkDone
  97.  
  98.     mov    ax, ERRbhand
  99.     jmps    DoExit
  100.  
  101. DoCkDone:
  102.     call    [si].THselect
  103.  
  104.     UAddr    UALiSta
  105.     in        al, dx
  106.  
  107.     and    al, 60h
  108.     cmp    al, 60h
  109.     je        DoDone
  110.  
  111.     xor    ax, ax
  112.     jmps    DoExit
  113.  
  114. DoDone:
  115.     mov    ax, 1
  116.  
  117. DoExit:
  118.     pop    si
  119.     pop    ds
  120.     pop    bp
  121.     retf
  122.  
  123. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  124.  
  125. _TTYGet:
  126.     push    bp
  127.     mov    bp, sp
  128.     push    ds
  129.     push    si
  130.     push    di
  131.  
  132.     mov    ax, cs
  133.     mov    ds, ax
  134.  
  135.     mov    al, 6[bp]
  136.     call    GetHand
  137.     jnc    GeCkData
  138.  
  139.     mov    ah, RXhinv
  140.     jmps    GeExit
  141.  
  142. GeCkData:
  143.     mov    bx, [si].THrxbuf.TBout
  144.     cmp    bx, [si].THrxbuf.TBin
  145.     jne    GeGet
  146.  
  147.     mov    ah, RXndat
  148.     jmps    GeExit
  149.  
  150. GeGet:
  151.     les    di, [si].THrxbuf.TBbuff
  152.     add    di, bx
  153.     add    di, bx
  154.  
  155.     mov    ax, es:[di]
  156.  
  157.     inc    bx
  158.     cmp    bx, [si].THrxbuf.TBsize
  159.     jne    GeNoWrap
  160.  
  161.     xor    bx, bx
  162.  
  163. GeNoWrap:
  164.     mov    [si].THrxbuf.TBout, bx
  165.  
  166. GeExit:
  167.     pop    di
  168.     pop    si
  169.     pop    ds
  170.     pop    bp
  171.     retf
  172.  
  173. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  174.  
  175. _TTYInit:
  176.     push    di
  177.  
  178.     mov    ax, cs
  179.     mov    es, ax
  180.  
  181.     lea    di, Handles
  182.  
  183.     xor    al, al
  184.     mov    cx, MAX_TTYS * SIZE TTYHand
  185.  
  186.     rep    stosb
  187.  
  188.     pop    di
  189.     retf
  190.  
  191. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  192.  
  193. _TTYOpen:
  194.     push    bp
  195.     mov    bp, sp
  196.     push    ds
  197.     push    si
  198.  
  199.     mov    ax, cs
  200.     mov    ds, ax
  201.  
  202.     call    HandAlloc                            ; Allocate handle (AX=h, SI=buf)
  203.     jc        OpExit                                ; If error C=1, AX=error
  204.  
  205.     push    ax                                        ; Save handle
  206.  
  207.     call    HandOpen                                ; Init buf with params
  208.     jc        OpHOErr                                ; If error C=1, AX=error
  209.  
  210.     pop    ax                                        ; No error, restore handle and exit
  211.     jmps    OpExit
  212.  
  213. OpHOErr:
  214.     pop    bx                                        ; Buf init error, discard handle
  215.     push    ax                                        ; Save error
  216.  
  217.     call    HandFree                                ; Free buf pointed to by SI
  218.  
  219.     pop    ax                                        ; Restore error and exit
  220.  
  221. OpExit:
  222.     pop    si
  223.     pop    ds
  224.     pop    bp
  225.     retf
  226.  
  227. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  228.  
  229. _TTYPut:
  230.     push    bp
  231.     mov    bp, sp
  232.     push    ds
  233.     push    si
  234.  
  235.     mov    ax, cs
  236.     mov    ds, ax
  237.  
  238.     mov    al, 6[bp]
  239.     call    GetHand
  240.     jnc    PuPut
  241.  
  242.     mov    ax, ERRbhand
  243.     jmps    PuExit
  244.  
  245. PuPut:
  246.     call    [si].THselect
  247.  
  248.     mov    ax, 8[bp]
  249.     call    QueueOut
  250.  
  251.     or        ax, ax
  252.     jnz    PuExit
  253.  
  254.     call    Resume
  255.     xor    ax, ax
  256.  
  257. PuExit:
  258.     pop    si
  259.     pop    ds
  260.     pop    bp
  261.     retf
  262.  
  263. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  264.  
  265. _TTYTerm:
  266.     push    si
  267.  
  268.     xor    si, si
  269.  
  270. TeLoop:
  271.     push    si
  272.     call    FAR PTR _TTYClose
  273.     pop    ax
  274.  
  275.     inc    si
  276.  
  277.     cmp    si, MAX_TTYS
  278.     jne    TeLoop
  279.  
  280.     pop    si
  281.     retf
  282.  
  283. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  284.  
  285. ;;;    This is a block of 16 ISR entry points, one for each possible IRQ
  286.  
  287. IVecList:
  288.  
  289. IVEC_NO    = 0
  290.  
  291. REPT        16
  292. GenIVIdx    %IVEC_NO
  293. IVEC_NO    = IVEC_NO + 1
  294.             ENDM
  295.  
  296. IVEC_NO    = 0
  297.  
  298. REPT        16
  299. GenIVec    %IVEC_NO
  300. IVEC_NO    = IVEC_NO + 1
  301.             ENDM
  302.  
  303. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  304.  
  305. DebugOut:
  306.     push    es
  307.     push    di
  308.     push    ax
  309.  
  310.     mov    ax, 0b800h
  311.     mov    es, ax
  312.     mov    di, 001d8h
  313.  
  314.     inc    DebugCnt
  315.  
  316.     mov    ax, DebugCnt
  317.     call    OutWord
  318.  
  319. DOexit:
  320.     pop    ax
  321.     pop    di
  322.     pop    es
  323.     ret
  324.  
  325. DebugCnt    DW    0
  326.  
  327. OutWord:
  328.     xchg    al, ah
  329.     call    OutByte
  330.  
  331.     xchg    al, ah
  332.     call    OutByte
  333.     ret
  334.  
  335. OutByte:
  336.     push    ax
  337.  
  338.     shr    al, 1
  339.     shr    al, 1
  340.     shr    al, 1
  341.     shr    al, 1
  342.  
  343.     call    OutNybb
  344.  
  345.     pop    ax
  346.  
  347.     call    OutNybb
  348.     ret
  349.  
  350. OutNybb:
  351.     push    ax
  352.  
  353.     and    al, 0fh
  354.     cmp    al, 9
  355.     jbe    ONok
  356.  
  357.     add    al, 7
  358.  
  359. ONok:
  360.     mov    ah, 01fh
  361.     add    al, 30h
  362.  
  363.     mov    es:[di], ax
  364.     inc    di
  365.     inc    di
  366.  
  367.     pop    ax
  368.     ret
  369.  
  370. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  371.  
  372. GetHand:
  373.     cmp    al, MAX_TTYS
  374.     jae    GHBadHand
  375.  
  376.     lea    si, Handles
  377.  
  378.     mov    ah, SIZE TTYHand
  379.     mul    ah
  380.  
  381.     add    si, ax
  382.  
  383.     test    [si].THflags, THFopen
  384.     jz        GHBadHand
  385.  
  386.     clc
  387.     ret
  388.  
  389. GHBadHand:
  390.     stc
  391.     ret
  392.  
  393. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  394.  
  395. HandAlloc:
  396.     lea    si, Handles
  397.     xor    ax, ax
  398.  
  399.     mov    cx, MAX_TTYS
  400.  
  401. HALoop:
  402.     test    [si].THflags, THFopen
  403.     jz        HAFound
  404.  
  405.     add    si, SIZE TTYHand
  406.     inc    ax
  407.  
  408.     loop    HALoop
  409.  
  410.     stc
  411.     jmps    HAExit
  412.  
  413. HAFound:
  414.     or        [si].THflags, THFopen
  415.  
  416.     clc
  417.  
  418. HAExit:
  419.     ret
  420.  
  421. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  422.  
  423. HandClose:
  424.     call    TermUART
  425.     call    TermIRQ
  426.     ret
  427.  
  428. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  429.  
  430. HandFree:
  431.     and    [si].THflags, 0ffffh-THFopen
  432.     ret
  433.  
  434. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  435.  
  436. HandOpen:
  437.     call    HOInitVars
  438.     call    HOInitParms
  439.  
  440.     call    InitIRQ
  441.  
  442.     call    InitUART
  443.     call    TermUART
  444.     call    InitUART
  445.  
  446.     xor    ax, ax
  447.     ret
  448.  
  449. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  450.  
  451. Slctors    DW    SlctDummy
  452.             DW    SlctV0
  453.             DW    SlctV1
  454.             DW    SlctV2
  455.             DW    SlctV3
  456.             DW    SlctV4
  457.             DW    SlctV5
  458.             DW    SlctV6
  459.             DW    SlctV7
  460.  
  461. HOInitParms:
  462.     mov    ax, 6[bp]
  463.     mov    [si].THioaddr, ax
  464.  
  465.     mov    ax, 8[bp]
  466.     mov    [si].THirqno, ax
  467.  
  468.     mov    bx, 10[bp]
  469.     shl    bx, 1
  470.     mov    ax, Slctors[bx]
  471.     mov    [si].THselect, ax
  472.  
  473.     mov    ax, 12[bp]
  474.     mov    WORD PTR [si].THrxbuf.TBbuff, ax
  475.  
  476.     mov    ax, 14[bp]
  477.     mov    WORD PTR [si].THrxbuf.TBbuff+2, ax
  478.  
  479.     mov    ax, 16[bp]
  480.     mov    [si].THrxbuf.TBsize, ax
  481.  
  482.     mov    ax, 18[bp]
  483.     mov    WORD PTR [si].THtxbuf.TBbuff, ax
  484.  
  485.     mov    ax, 20[bp]
  486.     mov    WORD PTR [si].THtxbuf.TBbuff+2, ax
  487.  
  488.     mov    ax, 22[bp]
  489.     mov    [si].THtxbuf.TBsize, ax
  490.  
  491.     ret
  492.  
  493. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  494.  
  495. HOInitVars:
  496.     xor    al, al
  497.     mov    [si].THlins, al
  498.     mov    [si].THmdms, al
  499.  
  500.     mov    al, LCWLen0+LCWLen1
  501.     mov    [si].THlinc, al
  502.  
  503.     mov    al, MCDTR+MCOUT2
  504.     mov    [si].THmdmc, al
  505.  
  506.     xor    ax, ax
  507.     mov    [si].THrxbuf.TBin, ax
  508.     mov    [si].THrxbuf.TBout, ax
  509.  
  510.     xor    ax, ax
  511.     mov    [si].THtxbuf.TBin, ax
  512.     mov    [si].THtxbuf.TBout, ax
  513.  
  514.     ret
  515.  
  516. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  517.  
  518. IHLSR:
  519.     UAddr    UALiSta
  520.     in        al, dx
  521.  
  522.     cmp    al, [si].THlins
  523.     je        LSRsame
  524.  
  525.     mov    [si].THlins, al
  526.  
  527.     mov    ah, RXlins
  528.     call    QueueIn
  529.  
  530. LSRsame:
  531.     jmp    IHLoop
  532.  
  533. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  534.  
  535. IHMSR:
  536.     UAddr    UAMdSta
  537.     in        al, dx
  538.  
  539.     mov    [si].THmdms, al
  540.  
  541.     mov    ah, RXmdms
  542.     call    QueueIn
  543.  
  544.     test    [si].THflags, THFhfctl
  545.     jz        MSRexit
  546.  
  547.     test    al, MSCTS
  548.     jz        MSRwait
  549.  
  550.     and    [si].THflags, 0ffffh-THFhwait
  551.     call    Resume
  552.  
  553.     jmps    MSRexit
  554.  
  555. MSRwait:
  556.     or        [si].THflags, THFhwait
  557.  
  558. MSRexit:
  559.     IF        DEBUG
  560.         xor    ax, ax
  561.         call    MSROut
  562.     ENDIF
  563.  
  564.     jmp    IHLoop
  565.  
  566. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  567.  
  568. IHRxD:
  569.     UAddr    UARxBuf
  570.     in        al, dx
  571.  
  572.     test    [si].THflags, THFxfctl
  573.     jz        RxDnxfctl
  574.  
  575.     cmp    al, 013h                                ; Ctrl-S
  576.     jne    RxDnpause
  577.  
  578.     or        [si].THflags, THFxwait
  579.     jmp    IHLoop
  580.  
  581. RxDnpause:
  582.     cmp    al, 011h                                ; Ctrl-Q
  583.     jne    RxDnxfctl
  584.  
  585.     and    [si].THflags, 0ffffh-THFxwait
  586.     call    Resume
  587.  
  588.     jmp    IHLoop
  589.  
  590. RxDnxfctl:
  591.     mov    ah, RXchar
  592.     call    QueueIn
  593.  
  594.     jmp    IHLoop
  595.  
  596. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  597.  
  598. IHTxD:
  599.     and    [si].THflags, 0ffffh-THFxmit
  600.     call    Resume
  601.  
  602.     jmp    IHLoop
  603.  
  604. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  605.  
  606. Init8259:
  607.     mov    bl, 1
  608.     mov    cl, BYTE PTR [si].THirqno
  609.     mov    dx, MOCW1
  610.  
  611.     cmp    cl, 8
  612.     jb        I82baseok
  613.  
  614.     sub    cl, 8
  615.     mov    dx, SOCW1
  616.  
  617. I82baseok:
  618.     shl    bl, cl
  619.  
  620.     xor    bl, 0ffh
  621.  
  622.     in        al, dx
  623.     and    al, bl
  624.     out    dx, al
  625.  
  626.     ret
  627.  
  628. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  629.  
  630. InitIRQ:
  631.     push    di
  632.  
  633.     mov    al, BYTE PTR [si].THirqno
  634.     mov    ah, SIZE TTYIrq
  635.     mul    ah
  636.  
  637.     lea    di, IrqPtrs
  638.     add    di, ax
  639.  
  640.     mov    ax, [di].TItail
  641.     mov    [si].THprvirq, ax
  642.  
  643.     xor    ax, ax
  644.     mov    [si].THnxtirq, ax
  645.  
  646.     mov    bx, [di].TItail
  647.     or        bx, bx
  648.     jz        IIRQfirst
  649.  
  650.     mov    [bx].THnxtirq, si
  651.     jmps    IIRQadded
  652.  
  653. IIRQfirst:
  654.     mov    [di].TIhead, si
  655.  
  656. IIRQadded:
  657.     mov    [di].TItail, si
  658.  
  659.     or        bx, bx
  660.     jnz    IIRQnfirst
  661.  
  662.     call    InitIVec
  663.     call    Init8259
  664.  
  665. IIRQnfirst:
  666.     pop    di
  667.     ret
  668.  
  669. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  670.  
  671. InitIVec:
  672.     push    di                                        ; DI = &TTYIrq
  673.  
  674.     xor    ax, ax
  675.     mov    es, ax
  676.  
  677.     mov    bx, [si].THirqno
  678.  
  679.     cmp    bl, 8
  680.     jb        IIVmast
  681.  
  682.     mov    di, 68h
  683.     jmps    IIVgetvec
  684.  
  685. IIVmast:
  686.     mov    di, 08h
  687.  
  688. IIVgetvec:
  689.     add    di, bx
  690.  
  691.     shl    di, 1
  692.     shl    di, 1
  693.  
  694.     shl    bx, 1
  695.  
  696.     mov    ax, WORD PTR IVecList[bx]
  697.     mov    bx, cs
  698.  
  699.     cli
  700.  
  701.     xchg    ax, es:[di]
  702.     xchg    bx, es:[di+2]
  703.  
  704.     pop    di                                        ; restore &TTYIrq
  705.  
  706.     mov    WORD PTR [di].TIoldvec, ax
  707.     mov    WORD PTR [di].TIoldvec+2, bx
  708.  
  709.     sti
  710.  
  711.     ret
  712.  
  713. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  714.  
  715. InitUART:
  716.     call    [si].THselect
  717.  
  718.     UAddr    UAIntEn
  719.     xor    al, al
  720.     out    dx, al
  721.  
  722.     UAddr    UALiCtl
  723.     mov    al, [si].THlinc
  724.     out    dx, al
  725.  
  726.     UAddr    UAMdCtl
  727.     mov    al, [si].THmdmc
  728.     out    dx, al
  729.  
  730.     UAddr    UARxBuf
  731.     in        al, dx
  732.  
  733.     UAddr    UALiSta
  734.     in        al, dx
  735.  
  736.     UAddr    UAMdSta
  737.     in        al, dx
  738.  
  739.     UAddr    UAIntEn
  740.     mov    al, 0fh
  741.     out    dx, al
  742.  
  743.     ret
  744.  
  745. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  746.  
  747. UARTInts    DW    IHMSR
  748.             DW    IHTxD
  749.             DW    IHRxD
  750.             DW    IHLSR
  751.  
  752. IntHand:
  753.     push    ds
  754.     push    es
  755.     push    di
  756.     push    ax
  757.     push    bx
  758.     push    cx
  759.     push    dx
  760.  
  761.     mov    ax, cs
  762.     mov    ds, ax
  763.  
  764.     mov    si, [si].TIhead
  765.  
  766. IHLoop:
  767.     call    [si].THselect
  768.  
  769.     UAddr    UAIntId
  770.     in        al, dx
  771.  
  772.     test    al, 01h
  773.     jnz    IHnext
  774.  
  775.     xor    bh, bh
  776.     mov    bl, al
  777.     jmp    UARTInts[bx]
  778.  
  779. IHnext:
  780.     test    [si].THnxtirq, 0ffffh
  781.     jz        IHexit
  782.  
  783.     mov    si, [si].THnxtirq
  784.     jmps    IHLoop
  785.  
  786. IHexit:
  787.     mov    al, 20h
  788.  
  789.     cmp    [si].THirqno, 8
  790.     jb        IHmaster
  791.  
  792.     out    SOCW2, al
  793.  
  794. IHmaster:
  795.     out    MOCW2, al
  796.  
  797.     pop    dx
  798.     pop    cx
  799.     pop    bx
  800.     pop    ax
  801.     pop    di
  802.     pop    es
  803.     pop    ds
  804.     pop    si
  805.     iret
  806.  
  807. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  808.  
  809. MSROut:
  810.     push    di
  811.  
  812.     mov    bx, 0b800h
  813.     mov    es, bx
  814.     mov    di, 00094h
  815.     add    di, ax
  816.  
  817.     mov    ah, 80h
  818.     mov    al, [si].THmdms
  819.     xor    bx, bx
  820.  
  821. MSROloop:
  822.     mov    cl, MSRChars[bx]
  823.  
  824.     test    al, ah
  825.     jnz    MSROhigh
  826.  
  827.     or        cl, 20h
  828.  
  829. MSROhigh:
  830.     mov    es:[di], cl
  831.     mov    BYTE PTR es:[di+1], 01fh
  832.     inc    di
  833.     inc    di
  834.  
  835.     shr    ah, 1
  836.     inc    bx
  837.  
  838.     cmp    bx, 4
  839.     jne    MSROloop
  840.  
  841.     mov    al, '-'
  842.     test    [si].THflags, THFhwait
  843.     jz        MSROhout
  844.  
  845.     mov    al, '+'
  846.  
  847. MSROhout:
  848.     mov    es:[di], al
  849.     mov    BYTE PTR es:[di+1], 01fh
  850.     inc    di
  851.     inc    di
  852.  
  853.     mov    al, '-'
  854.     test    [si].THflags, THFxwait
  855.     jz        MSROxout
  856.  
  857.     mov    al, '+'
  858.  
  859. MSROxout:
  860.     mov    es:[di], al
  861.     mov    BYTE PTR es:[di+1], 01fh
  862.  
  863.     pop    di
  864.     ret
  865.  
  866. MSRChars    DB    'QRDC'
  867.  
  868. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  869.  
  870. OutBaud:
  871.     xor    bh, bh
  872.     mov    bl, al
  873.     shl    bx, 1
  874.  
  875.     UAddr    UALiCtl
  876.     mov    al, [si].THlinc
  877.     or        al, LCDLAB
  878.     out    dx, al
  879.  
  880.     mov    ax, BaudTab[bx]
  881.  
  882.     UAddr    UADvLsb
  883.     out    dx, al
  884.  
  885.     UAddr    UADvMsb
  886.     mov    al, ah
  887.     out    dx, al
  888.  
  889.     UAddr    UALiCtl
  890.     mov    al, [si].THlinc
  891.     out    dx, al
  892.  
  893.     ret
  894.  
  895. BaudTab    DW    384
  896.             DW    96
  897.             DW    48
  898.             DW    24
  899.             DW    12
  900.             DW    6
  901.             DW    3
  902.             DW    2
  903.             DW    1
  904.  
  905. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  906.  
  907. OutChar:
  908.     or        [si].THflags, THFxmit
  909.  
  910.     UAddr    UATxBuf
  911.     out    dx, al
  912.  
  913.     ret
  914.  
  915. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  916.  
  917. OutLinC:
  918.     mov    [si].THlinc, al
  919.  
  920.     UAddr    UALiCtl
  921.     out    dx, al
  922.  
  923.     ret
  924.  
  925. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  926.  
  927. OutMdmC:
  928.     mov    [si].THmdmc, al
  929.  
  930.     UAddr    UAMdCtl
  931.     out    dx, al
  932.  
  933.     ret
  934.  
  935. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  936.  
  937. OutProc:
  938.     IF        DEBUG
  939.         call    DebugOut
  940.     ENDIF
  941.  
  942.     cmp    ah, TXchar
  943.     je        OPchar
  944.  
  945.     cmp    ah, TXbaud
  946.     je        OPbaud
  947.  
  948.     cmp    ah, TXhwfc
  949.     je        OPhwfc
  950.  
  951.     cmp    ah, TXlinc
  952.     je        OPlinc
  953.  
  954.     cmp    ah, TXmdmc
  955.     je        OPmdmc
  956.  
  957.     cmp    ah, TXxofc
  958.     je        OPxofc
  959.  
  960.     ret
  961.  
  962. OPbaud:
  963.     jmp    OutBaud
  964.  
  965. OPchar:
  966.     jmp    OutChar
  967.  
  968. OPlinc:
  969.     jmp    OutLinC
  970.  
  971. OPmdmc:
  972.     jmp    OutMdmC
  973.  
  974. OPhwfc:
  975.     or        al, al
  976.     jz        OPhdis
  977.  
  978.     or        [si].THflags, THFhfctl
  979.     and    [si].THflags, 0ffffh-THFhwait
  980.     ret
  981.  
  982. OPhdis:
  983.     and    [si].THflags, 0ffffh-THFhfctl
  984.     ret
  985.  
  986. OPxofc:
  987.     or        al, al
  988.     jz        OPxdis
  989.  
  990.     or        [si].THflags, THFxfctl
  991.     and    [si].THflags, 0ffffh-THFxwait
  992.     ret
  993.  
  994. OPxdis:
  995.     and    [si].THflags, 0ffffh-THFxfctl
  996.     ret
  997.  
  998. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  999.  
  1000. QueueIn:
  1001.     push    di
  1002.  
  1003.     les    di, [si].THrxbuf.TBbuff
  1004.     mov    bx, [si].THrxbuf.TBin
  1005.     add    di, bx
  1006.     add    di, bx
  1007.  
  1008.     inc    bx
  1009.  
  1010.     cmp    bx, [si].THrxbuf.TBsize
  1011.     jne    QINoWrap
  1012.  
  1013.     xor    bx, bx
  1014.  
  1015. QINoWrap:
  1016.     cmp    bx, [si].THrxbuf.TBout
  1017.     je        QIExit
  1018.  
  1019.     mov    es:[di], ax
  1020.     mov    [si].THrxbuf.TBin, bx
  1021.  
  1022. QIExit:
  1023.     pop    di
  1024.     ret
  1025.  
  1026. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1027.  
  1028. QueueOut:
  1029.     push    di
  1030.  
  1031.     les    di, [si].THtxbuf.TBbuff
  1032.     mov    bx, [si].THtxbuf.TBin
  1033.     add    di, bx
  1034.     add    di, bx
  1035.  
  1036.     inc    bx
  1037.  
  1038.     cmp    bx, [si].THtxbuf.TBsize
  1039.     jne    QONoWrap
  1040.  
  1041.     xor    bx, bx
  1042.  
  1043. QONoWrap:
  1044.     cmp    bx, [si].THtxbuf.TBout
  1045.     je        QOFull
  1046.  
  1047.     mov    es:[di], ax
  1048.     mov    [si].THtxbuf.TBin, bx
  1049.  
  1050.     xor    ax, ax
  1051.     jmps    QOExit
  1052.  
  1053. QOFull:
  1054.     mov    ax, ERRqfull
  1055.  
  1056. QOExit:
  1057.     pop    di
  1058.     ret
  1059.  
  1060. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1061.  
  1062. Resume:
  1063.     pushf
  1064.  
  1065.     IF        DEBUG
  1066.         mov    ax, 000a0h
  1067.         call    MSROut
  1068.     ENDIF
  1069.  
  1070.     cli
  1071.  
  1072.     test    [si].THflags, THFxmit+THFhwait+THFxwait
  1073.     jnz    ReExit
  1074.  
  1075. ReLoop:
  1076.     mov    bx, [si].THtxbuf.TBout
  1077.     cmp    bx, [si].THtxbuf.TBin
  1078.     je        ReExit
  1079.  
  1080.     les    di, [si].THtxbuf.TBbuff
  1081.     add    di, bx
  1082.     add    di, bx
  1083.  
  1084.     inc    bx
  1085.     cmp    bx, [si].THtxbuf.TBsize
  1086.     jne    ReNoWrap
  1087.  
  1088.     xor    bx, bx
  1089.  
  1090. ReNoWrap:
  1091.     mov    [si].THtxbuf.TBout, bx
  1092.  
  1093.     mov    ax, es:[di]
  1094.     call    OutProc
  1095.  
  1096.     test    [si].THflags, THFxmit
  1097.     jz        ReLoop
  1098.  
  1099. ReExit:
  1100.     popf
  1101.     ret
  1102.  
  1103. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1104.  
  1105. SlctDummy:
  1106.     ret
  1107.  
  1108. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1109.  
  1110. SlctV0:
  1111.     xor    al, al
  1112.     UAddr    UAHCR
  1113.     out    dx, al
  1114.     ret
  1115.  
  1116. SlctV1:
  1117.     mov    al, 1
  1118.     UAddr    UAHCR
  1119.     out    dx, al
  1120.     ret
  1121.  
  1122. SlctV2:
  1123.     mov    al, 2
  1124.     UAddr    UAHCR
  1125.     out    dx, al
  1126.     ret
  1127.  
  1128. SlctV3:
  1129.     mov    al, 3
  1130.     UAddr    UAHCR
  1131.     out    dx, al
  1132.     ret
  1133.  
  1134. SlctV4:
  1135.     mov    al, 4
  1136.     UAddr    UAHCR
  1137.     out    dx, al
  1138.     ret
  1139.  
  1140. SlctV5:
  1141.     mov    al, 5
  1142.     UAddr    UAHCR
  1143.     out    dx, al
  1144.     ret
  1145.  
  1146. SlctV6:
  1147.     mov    al, 6
  1148.     UAddr    UAHCR
  1149.     out    dx, al
  1150.     ret
  1151.  
  1152. SlctV7:
  1153.     mov    al, 7
  1154.     UAddr    UAHCR
  1155.     out    dx, al
  1156.     ret
  1157.  
  1158. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1159.  
  1160. Term8259:
  1161.     mov    bl, 1
  1162.     mov    cl, BYTE PTR [si].THirqno
  1163.     mov    dx, MOCW1
  1164.  
  1165.     cmp    cl, 8
  1166.     jb        T82baseok
  1167.  
  1168.     sub    cl, 8
  1169.     mov    dx, SOCW1
  1170.  
  1171. T82baseok:
  1172.     shl    bl, cl
  1173.  
  1174.     in        al, dx
  1175.     or        al, bl
  1176.     out    dx, al
  1177.  
  1178.     ret
  1179.  
  1180. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1181.  
  1182. TermIRQ:
  1183.     push    di
  1184.  
  1185.     mov    al, BYTE PTR [si].THirqno
  1186.     mov    ah, SIZE TTYIrq
  1187.     mul    ah
  1188.  
  1189.     lea    di, IrqPtrs
  1190.     add    di, ax
  1191.  
  1192.     mov    ax, [si].THnxtirq
  1193.  
  1194.     mov    bx, [si].THprvirq
  1195.     or        bx, ax
  1196.     jz        TIRQnprv
  1197.  
  1198.     mov    [bx].THnxtirq, ax
  1199.     jmps    TIRQlnxt
  1200.  
  1201. TIRQnprv:
  1202.     mov    [di].TIhead, ax
  1203.  
  1204. TIRQlnxt:
  1205.     mov    ax, [si].THprvirq
  1206.  
  1207.     mov    bx, [si].THnxtirq
  1208.     or        bx, bx
  1209.     jz        TIRQnnxt
  1210.  
  1211.     mov    [bx].THprvirq, ax
  1212.     jmps    TIRQunlnkd
  1213.  
  1214. TIRQnnxt:
  1215.     mov    [di].TItail, ax
  1216.  
  1217. TIRQunlnkd:
  1218.     mov    ax, [di].TIhead
  1219.     and    ax, [di].TItail                    ; if list is empty, then AX=0ffffh
  1220.     inc    ax
  1221.     jnz    TIRQnlast                            ; if inc != 0, then not empty
  1222.  
  1223.     call    Term8259
  1224.     call    TermIVec
  1225.  
  1226. TIRQnlast:
  1227.     pop    di
  1228.     ret
  1229.  
  1230. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1231.  
  1232. TermIVec:
  1233.     push    di                                        ; DI = &TTYIrq
  1234.  
  1235.     xor    ax, ax
  1236.     mov    es, ax
  1237.  
  1238.     mov    ax, WORD PTR [di].TIoldvec
  1239.     mov    bx, WORD PTR [di].TIoldvec+2
  1240.  
  1241.     mov    di, [si].THirqno
  1242.     add    di, 8
  1243.     shl    di, 1
  1244.     shl    di, 1
  1245.  
  1246.     cli
  1247.  
  1248.     mov    es:[di], ax
  1249.     mov    es:[di+2], bx
  1250.  
  1251.     sti
  1252.  
  1253.     pop    di
  1254.     ret
  1255.  
  1256. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1257.  
  1258. TermUART:
  1259.     call    [si].THselect
  1260.  
  1261.     xor    al, al
  1262.  
  1263.     UAddr    UAIntEn
  1264.     out    dx, al
  1265.  
  1266.     UAddr    UAMdCtl
  1267.     out    dx, al
  1268.  
  1269.     ret
  1270.  
  1271. ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
  1272.  
  1273. TTY_TEXT    ENDS
  1274.  
  1275.             END
  1276.